home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
C
/
Applications
/
GW AdaEd 1.4.2
/
GWAdaDemos
/
NYUDemos
/
PAGER_PART2.ADA
< prev
next >
Wrap
Text File
|
1994-01-09
|
27KB
|
855 lines
--===========================================================================
---------------------------- PROCEDURE PARSER -------------------------------
--===========================================================================
-- PARSER parses a LINE and returns the number of tokens in that LINE
-- and the first token as COMMAND (converted to lower-case) with the
-- rest of the tokens in ARGS (a linked list of argument LINEs)
with LINE_DEFINITION;
use LINE_DEFINITION;
procedure PARSER(INLINE : in LINE_DEFINITION.LINE;
NARGS : out NATURAL;
COMMAND : out LINE_DEFINITION.LINE;
ARGS : in out LINE_DEFINITION.LINE_LIST) is
ROVER : NATURAL;
LROVER : LINE_DEFINITION.LINE_LIST := null;
LFIRST : LINE_DEFINITION.LINE_LIST := null;
LCOMMAND : LINE_DEFINITION.LINE;
LTEMP : LINE_DEFINITION.LINE;
LARGS : NATURAL := 0;
procedure SKIP_SPACES is
begin
while INLINE.CONTENT(ROVER) <= ' ' and ROVER <= INLINE.LAST loop
ROVER := ROVER + 1;
end loop;
end SKIP_SPACES;
procedure EXTRACT(ITEM : out LINE_DEFINITION.LINE) is
EXTRACT_ROVER : NATURAL := 0;
begin
while INLINE.CONTENT(ROVER) > ' ' and ROVER <= INLINE.LAST loop
EXTRACT_ROVER := EXTRACT_ROVER + 1;
ITEM.CONTENT(EXTRACT_ROVER) := INLINE.CONTENT(ROVER);
ROVER := ROVER + 1;
end loop;
ITEM.LAST := EXTRACT_ROVER;
end EXTRACT;
begin
COMMAND.LAST := 0;
ROVER := INLINE.CONTENT'FIRST;
SKIP_SPACES;
if ROVER <= INLINE.LAST then
EXTRACT(LCOMMAND);
LCOMMAND.LAST := LCOMMAND.LAST + 1;
LCOMMAND.CONTENT(LCOMMAND.LAST) := ' ';
COMMAND := LINE_DEFINITION.TOLOWER(LCOMMAND);
LARGS := 1;
LROVER := ARGS;
while ROVER <= INLINE.LAST loop
SKIP_SPACES;
if ROVER <= INLINE.LAST then
EXTRACT(LTEMP);
if ARGS = null then
ARGS := new LINE_DEFINITION.LINE_LIST_ELEMENT;
LROVER := ARGS;
LROVER.NEXT := null;
end if;
LROVER.CONTENT := LTEMP;
LARGS := LARGS + 1;
if LROVER.NEXT = null then
LROVER.NEXT := new LINE_DEFINITION.LINE_LIST_ELEMENT;
end if;
LROVER := LROVER.NEXT;
end if;
end loop;
end if;
NARGS := LARGS;
end PARSER;
--===========================================================================
---------------------------- PACKAGE PAGED_FILE -----------------------------
--===========================================================================
with LINE_DEFINITION;
package PAGED_FILE is
procedure COMPUTE_CHECKSUM (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST);
-- Compute the checksum of a paged file
procedure MAKE_INCLUDE_FILE (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST);
-- Create an include file which names the elements of a paged file
procedure LIST (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST);
-- List the names of the elements of a paged file
procedure CREATE (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST);
-- Create a paged file
procedure UNPAGE (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST);
-- Extract the elements of a paged file
end PAGED_FILE;
with INCLUDE_FILE, INPUT_FILE, OUTPUT_FILE, PARSER;
with TEXT_IO;
package body PAGED_FILE is
INLINE : LINE_DEFINITION.LINE;
--=======================================================================
-- PAGED_FILE, Support Utilities
--=======================================================================
use LINE_DEFINITION;
-- Determine if ITEM contains a BANNER or COMMENT_BANNER
function IS_BANNER(ITEM : in LINE_DEFINITION.LINE) return BOOLEAN is
RESULT : BOOLEAN;
begin
if ITEM.LAST >= LINE_DEFINITION.BANNER'LENGTH and then
ITEM.CONTENT(1 .. LINE_DEFINITION.BANNER'LENGTH) =
LINE_DEFINITION.BANNER then
RESULT := TRUE;
elsif ITEM.LAST >= LINE_DEFINITION.COMMENT_BANNER'LENGTH and then
ITEM.CONTENT(1 .. LINE_DEFINITION.COMMENT_BANNER'LENGTH) =
LINE_DEFINITION.COMMENT_BANNER then
RESULT := TRUE;
else
RESULT := FALSE;
end if;
return RESULT;
end IS_BANNER;
-- Package to handle line counting
package COUNTER is
-- Reset the Counter
procedure SET;
-- Increment the Counter
procedure INCREMENT;
-- Print the counter
procedure PRINT;
end COUNTER;
package body COUNTER is
type LINE_COUNT is range 0 .. 10001;
package LINE_COUNT_IO is new TEXT_IO.INTEGER_IO(LINE_COUNT);
LCOUNT : LINE_COUNT;
-- Reset the LCOUNT variable
procedure SET is
begin
LCOUNT := 0;
end SET;
-- Increment the LCOUNT variable
procedure INCREMENT is
begin
if LCOUNT < LINE_COUNT'LAST then
LCOUNT := LCOUNT + 1;
end if;
end INCREMENT;
-- Print a count of the number of lines and reset the LCOUNT variable
procedure PRINT is
begin
TEXT_IO.PUT(" -- ");
if LCOUNT = LINE_COUNT'LAST then
TEXT_IO.PUT("More Than" & LINE_COUNT'IMAGE(LINE_COUNT'LAST -
1));
else
LINE_COUNT_IO.PUT(LCOUNT, 1);
end if;
TEXT_IO.PUT_LINE(" Lines");
LCOUNT := 0;
end PRINT;
end COUNTER;
--=======================================================================
-- PAGED_FILE, COMPUTE_CHECKSUM Command
--=======================================================================
procedure COMPUTE_CHECKSUM (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST) is
CHECKSUM : INTEGER;
package VALUE_IO is new TEXT_IO.INTEGER_IO(INTEGER);
begin
if NARGS = 1 then
TEXT_IO.PUT_LINE(" CHECK Command requires the name of a file");
TEXT_IO.PUT_LINE(" Syntax: list file_name");
else
-- Step 1: Open the input file
INPUT_FILE.OPEN(ARGLIST.CONTENT);
-- Step 2: Compute the Hash (Checksum)
CHECKSUM := 0;
while not INPUT_FILE.END_OF_FILE loop
INPUT_FILE.READ(INLINE);
for I in 1 .. INLINE.LAST loop
if INLINE.CONTENT(I) > ' ' then
CHECKSUM := CHECKSUM +
CHARACTER'POS(INLINE.CONTENT(I));
if CHECKSUM >= 128 then
CHECKSUM := CHECKSUM - 128;
end if;
end if;
end loop;
end loop;
INPUT_FILE.CLOSE;
-- Step 3: Print the result
TEXT_IO.PUT(" Pager Checksum (Hash) of " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) & " is ");
VALUE_IO.PUT(CHECKSUM, 1);
TEXT_IO.NEW_LINE;
end if;
exception
when INPUT_FILE.FILE_NOT_FOUND =>
TEXT_IO.PUT(" CHECK:");
TEXT_IO.PUT_LINE(" File " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" not Found");
when INPUT_FILE.READ_PAST_END_OF_FILE =>
TEXT_IO.PUT(" CHECK:");
TEXT_IO.PUT_LINE(" Premature EOF on " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT));
INPUT_FILE.CLOSE;
when others =>
TEXT_IO.PUT(" CHECK:");
TEXT_IO.PUT_LINE(" Unexpected Error");
INPUT_FILE.CLOSE;
end COMPUTE_CHECKSUM;
--=======================================================================
-- PAGED_FILE, MAKE_INCLUDE_FILE Command
--=======================================================================
procedure MAKE_INCLUDE_FILE (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST) is
IN_FILE : BOOLEAN;
ARG_ROVER : LINE_DEFINITION.LINE_LIST;
begin
if NARGS < 3 then
TEXT_IO.PUT_LINE
(" INCLUDE Command requires the name of a paged file");
TEXT_IO.PUT_LINE
(" Syntax: include paged_file_name output_include_file");
else
-- Step 1: Open the input and output files
COUNTER.SET;
ARG_ROVER := ARGLIST.NEXT;
INPUT_FILE.OPEN(ARGLIST.CONTENT);
OUTPUT_FILE.OPEN(ARG_ROVER.CONTENT);
OUTPUT_FILE.WRITE("-- Include file for " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT));
-- Step 2: Look for the first banner in the paged file
IN_FILE := TRUE;
while not INPUT_FILE.END_OF_FILE loop
INPUT_FILE.READ(INLINE);
if IS_BANNER(INLINE) then
IN_FILE := FALSE;
exit;
end if;
end loop;
-- Step 3: If first banner not found, issue error message,
-- else process component files
if IN_FILE then
TEXT_IO.PUT_LINE
(" File " & LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" does not contain any components");
else
-- Loop until the end of the input paged file
while not INPUT_FILE.END_OF_FILE loop
-- Read the next line from the input paged file
INPUT_FILE.READ(INLINE);
-- If we are not in the text of the file, the line just
-- read contains the name of a new file, else it contains
-- a line of the current component file
if not IN_FILE then
-- Remove leading comment character if any and print the
-- name of the component file
if INLINE.CONTENT(1 .. 2) = "--" then
TEXT_IO.PUT(" " &
INLINE.CONTENT(3 .. INLINE.LAST));
OUTPUT_FILE.WRITE
(INLINE.CONTENT(3 .. INLINE.LAST));
else
TEXT_IO.PUT(" " &
INLINE.CONTENT(1 .. INLINE.LAST));
OUTPUT_FILE.WRITE
(INLINE.CONTENT(1 .. INLINE.LAST));
end if;
-- Flush the trailing banner line and note that we are
-- now within the text of a component file
INPUT_FILE.READ(INLINE);
COUNTER.SET;
IN_FILE := TRUE;
else
-- We are within the text of a component file, so check
-- for a banner in order to determine if we are at the end
-- of the component file
if IS_BANNER(INLINE) then
IN_FILE := FALSE;
COUNTER.PRINT;
else
COUNTER.INCREMENT;
end if;
end if;
end loop;
end if;
COUNTER.PRINT;
INPUT_FILE.CLOSE;
OUTPUT_FILE.CLOSE;
end if;
exception
when OUTPUT_FILE.CANNOT_CREATE_FILE =>
TEXT_IO.PUT(" INCLUDE:");
TEXT_IO.PUT_LINE(" Cannot create " &
LINE_DEFINITION.CONVERT(ARG_ROVER.CONTENT));
when INPUT_FILE.FILE_NOT_FOUND =>
TEXT_IO.PUT(" INCLUDE:");
TEXT_IO.PUT_LINE
(" File " & LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" not Found");
when INPUT_FILE.READ_PAST_END_OF_FILE =>
TEXT_IO.PUT(" INCLUDE:");
TEXT_IO.PUT_LINE(" Premature EOF on " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT));
INPUT_FILE.CLOSE;
when others =>
TEXT_IO.PUT(" INCLUDE:");
TEXT_IO.PUT_LINE(" Unexpected Error");
INPUT_FILE.CLOSE;
end MAKE_INCLUDE_FILE;
--=======================================================================
-- PAGED_FILE, LIST Command
--=======================================================================
procedure LIST (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST) is
IN_FILE : BOOLEAN;
begin
if NARGS = 1 then
TEXT_IO.PUT_LINE
(" LIST Command requires the name of a paged file");
TEXT_IO.PUT_LINE
(" Syntax: list paged_file_name");
else
-- Step 1: Open the input file
COUNTER.SET;
INPUT_FILE.OPEN(ARGLIST.CONTENT);
-- Step 2: Look for the first banner in the paged file
IN_FILE := TRUE;
while not INPUT_FILE.END_OF_FILE loop
INPUT_FILE.READ(INLINE);
if IS_BANNER(INLINE) then
IN_FILE := FALSE;
exit;
end if;
end loop;
-- Step 3: If first banner not found, issue error message,
-- else process component files
if IN_FILE then
TEXT_IO.PUT_LINE
(" File " & LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" does not contain any components");
else
-- Loop until the end of the input paged file
while not INPUT_FILE.END_OF_FILE loop
-- Read the next line from the input paged file
INPUT_FILE.READ(INLINE);
-- If we are not in the text of the file, the line just
-- read contains the name of a new file, else it contains
-- a line of the current component file
if not IN_FILE then
-- Remove leading comment character if any and print
-- the name of the component file
if INLINE.CONTENT(1 .. 2) = "--" then
TEXT_IO.PUT(" " &
INLINE.CONTENT(3 .. INLINE.LAST));
else
TEXT_IO.PUT(" " &
INLINE.CONTENT(1 .. INLINE.LAST));
end if;
-- Flush the trailing banner line and note that we are
-- now within the text of a component file
INPUT_FILE.READ(INLINE);
COUNTER.SET;
IN_FILE := TRUE;
else
-- We are within the text of a component file, so
-- check for a banner in order to determine if we
-- are at the end of the component file
if IS_BANNER(INLINE) then
IN_FILE := FALSE;
COUNTER.PRINT;
else
COUNTER.INCREMENT;
end if;
end if;
end loop;
end if;
COUNTER.PRINT;
INPUT_FILE.CLOSE;
end if;
exception
when INPUT_FILE.FILE_NOT_FOUND =>
TEXT_IO.PUT(" LIST:");
TEXT_IO.PUT_LINE
(" File " & LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" not Found");
when INPUT_FILE.READ_PAST_END_OF_FILE =>
TEXT_IO.PUT(" LIST:");
TEXT_IO.PUT_LINE(" Premature EOF on " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT));
INPUT_FILE.CLOSE;
when others =>
TEXT_IO.PUT(" LIST:");
TEXT_IO.PUT_LINE(" Unexpected Error");
INPUT_FILE.CLOSE;
end LIST;
--=======================================================================
-- PAGED_FILE, CREATE Command
--=======================================================================
procedure CREATE (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST) is
COMPONENT_FILE_NAME : LINE_DEFINITION.LINE;
OUTPUT_FILE_NAME : LINE_DEFINITION.LINE;
ARG_ROVER : LINE_DEFINITION.LINE_LIST;
begin
if NARGS < 3 then
TEXT_IO.PUT_LINE
(" PAGE Command requires the name of the paged file and include file");
TEXT_IO.PUT_LINE
(" Syntax: page [@include_file_name|file_name]+ paged_file_name");
else
ARG_ROVER := ARGLIST;
for I in 1 .. NARGS-2 loop
ARG_ROVER := ARG_ROVER.NEXT;
end loop;
OUTPUT_FILE_NAME := ARG_ROVER.CONTENT;
OUTPUT_FILE.OPEN(OUTPUT_FILE_NAME);
ARG_ROVER := ARGLIST;
for I in 1 .. NARGS-2 loop
if ARG_ROVER.CONTENT.CONTENT(1) =
INCLUDE_FILE.INCLUDE_CHARACTER then
INCLUDE_FILE.OPEN
(LINE_DEFINITION.CONVERT(ARG_ROVER.CONTENT));
begin
loop
INCLUDE_FILE.READ(COMPONENT_FILE_NAME);
INPUT_FILE.OPEN(COMPONENT_FILE_NAME);
OUTPUT_FILE.WRITE(LINE_DEFINITION.COMMENT_BANNER);
OUTPUT_FILE.WRITE("--" &
LINE_DEFINITION.CONVERT(COMPONENT_FILE_NAME));
OUTPUT_FILE.WRITE(LINE_DEFINITION.COMMENT_BANNER);
TEXT_IO.PUT(" Adding " &
LINE_DEFINITION.CONVERT(COMPONENT_FILE_NAME));
COUNTER.SET;
while not INPUT_FILE.END_OF_FILE loop
INPUT_FILE.READ(INLINE);
OUTPUT_FILE.WRITE(INLINE);
COUNTER.INCREMENT;
end loop;
COUNTER.PRINT;
INPUT_FILE.CLOSE;
end loop;
exception
when INCLUDE_FILE.READ_PAST_END_OF_FILE |
INCLUDE_FILE.INCLUDE_FILE_EMPTY |
INCLUDE_FILE.NESTING_LEVEL_EXCEEDED =>
INCLUDE_FILE.STOP;
when INPUT_FILE.FILE_NOT_FOUND =>
TEXT_IO.PUT_LINE(" File " &
LINE_DEFINITION.CONVERT(COMPONENT_FILE_NAME) &
" not Found");
INCLUDE_FILE.STOP;
when others =>
TEXT_IO.PUT_LINE
(" Unexpected Error During Processing " &
"of Component File " &
LINE_DEFINITION.CONVERT(COMPONENT_FILE_NAME));
INCLUDE_FILE.STOP;
end;
else
INPUT_FILE.OPEN(ARG_ROVER.CONTENT);
OUTPUT_FILE.WRITE(LINE_DEFINITION.COMMENT_BANNER);
OUTPUT_FILE.WRITE("--" &
LINE_DEFINITION.CONVERT(ARG_ROVER.CONTENT));
OUTPUT_FILE.WRITE(LINE_DEFINITION.COMMENT_BANNER);
TEXT_IO.PUT(" Adding " &
LINE_DEFINITION.CONVERT(ARG_ROVER.CONTENT));
COUNTER.SET;
while not INPUT_FILE.END_OF_FILE loop
INPUT_FILE.READ(INLINE);
OUTPUT_FILE.WRITE(INLINE);
COUNTER.INCREMENT;
end loop;
COUNTER.PRINT;
INPUT_FILE.CLOSE;
end if;
ARG_ROVER := ARG_ROVER.NEXT;
end loop;
OUTPUT_FILE.CLOSE;
end if;
exception
when OUTPUT_FILE.CANNOT_CREATE_FILE =>
TEXT_IO.PUT(" PAGE:");
TEXT_IO.PUT_LINE(" Cannot create " &
LINE_DEFINITION.CONVERT(OUTPUT_FILE_NAME));
when INCLUDE_FILE.FILE_NOT_FOUND =>
TEXT_IO.PUT(" PAGE:");
TEXT_IO.PUT_LINE(" Cannot open include file");
when others =>
TEXT_IO.PUT(" PAGE:");
TEXT_IO.PUT_LINE(" Unexpected Error");
INPUT_FILE.CLOSE;
end CREATE;
--=======================================================================
-- PAGED_FILE, UNPAGE Command
--=======================================================================
procedure UNPAGE (NARGS : in NATURAL;
ARGLIST : in LINE_DEFINITION.LINE_LIST) is
IN_FILE : BOOLEAN;
OUTPUT_FILE_NAME : LINE_DEFINITION.LINE;
begin
if NARGS = 1 then
TEXT_IO.PUT_LINE
(" UNPAGE Command requires the name of a paged file");
TEXT_IO.PUT_LINE(" Syntax: unpage paged_file_name");
else
-- Step 1: Open the input file
COUNTER.SET;
INPUT_FILE.OPEN(ARGLIST.CONTENT);
-- Step 2: Look for the first banner in the paged file
IN_FILE := TRUE;
while not INPUT_FILE.END_OF_FILE loop
INPUT_FILE.READ(INLINE);
if IS_BANNER(INLINE) then
IN_FILE := FALSE;
exit;
end if;
end loop;
-- Step 3: If first banner not found, issue error message,
-- else process component files
if IN_FILE then
TEXT_IO.PUT_LINE(" File " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" does not contain any components");
else
-- Loop until the end of the input paged file
while not INPUT_FILE.END_OF_FILE loop
-- Read the next line from the input paged file
INPUT_FILE.READ(INLINE);
-- If we are not in the text of the file, the line just
-- read contains the name of a new file, else it contains
-- a line of the current component file
if not IN_FILE then
-- Remove leading comment character if any and
-- store the name of the component file
if INLINE.CONTENT(1 .. 2) = "--" then
OUTPUT_FILE_NAME :=
LINE_DEFINITION.CONVERT
(INLINE.CONTENT(3 .. INLINE.LAST));
else
OUTPUT_FILE_NAME :=
LINE_DEFINITION.CONVERT
(INLINE.CONTENT(1 .. INLINE.LAST));
end if;
-- Open the new component file
OUTPUT_FILE.OPEN(OUTPUT_FILE_NAME);
TEXT_IO.PUT(" Extracting " &
LINE_DEFINITION.CONVERT(OUTPUT_FILE_NAME));
-- Flush the trailing banner line and note that we are
-- now within the text of a component file
INPUT_FILE.READ(INLINE);
IN_FILE := TRUE;
COUNTER.SET;
else
-- We are within the text of a component file, so
-- check for a banner in order to determine if we
-- are at the end of the component file
if IS_BANNER(INLINE) then
OUTPUT_FILE.CLOSE;
IN_FILE := FALSE;
COUNTER.PRINT;
else
OUTPUT_FILE.WRITE(INLINE);
COUNTER.INCREMENT;
end if;
end if;
end loop;
OUTPUT_FILE.CLOSE;
end if;
COUNTER.PRINT;
INPUT_FILE.CLOSE;
end if;
exception
when OUTPUT_FILE.CANNOT_CREATE_FILE =>
TEXT_IO.PUT(" UNPAGE:");
TEXT_IO.PUT_LINE(" Cannot create " &
LINE_DEFINITION.CONVERT(OUTPUT_FILE_NAME));
when INPUT_FILE.FILE_NOT_FOUND =>
TEXT_IO.PUT(" UNPAGE:");
TEXT_IO.PUT_LINE(" File " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT) &
" not Found");
when INPUT_FILE.READ_PAST_END_OF_FILE =>
TEXT_IO.PUT(" UNPAGE:");
TEXT_IO.PUT_LINE(" Premature EOF on " &
LINE_DEFINITION.CONVERT(ARGLIST.CONTENT));
INPUT_FILE.CLOSE;
when others =>
TEXT_IO.PUT(" UNPAGE:");
TEXT_IO.PUT_LINE(" Unexpected Error");
INPUT_FILE.CLOSE;
end UNPAGE;
end PAGED_FILE;
--===========================================================================
--------------------------------- MAINLINE ----------------------------------
--===========================================================================
with LINE_DEFINITION, PAGED_FILE, PARSER;
use LINE_DEFINITION;
with TEXT_IO;
with CLI;
procedure PAGER2 is
TITLE : constant STRING := "PAGER2, Ada Version 1.1";
INLINE : LINE_DEFINITION.LINE;
NARGS : NATURAL;
COMMAND : LINE_DEFINITION.LINE;
ARGLIST : LINE_DEFINITION.LINE_LIST;
ARG_ROVER : LINE_DEFINITION.LINE_LIST;
-- Command Verbs
HELP_COMMAND : constant STRING := "help ";
H_COMMAND : constant STRING := "h ";
EXIT_COMMAND : constant STRING := "exit ";
X_COMMAND : constant STRING := "x "; -- same as exit
CHECK_COMMAND : constant STRING := "check ";
C_COMMAND : constant STRING := "c "; -- same as check
INCLUDE_COMMAND : constant STRING := "include ";
I_COMMAND : constant STRING := "i "; -- same as include
LIST_COMMAND : constant STRING := "list ";
L_COMMAND : constant STRING := "l "; -- same as list
PAGE_COMMAND : constant STRING := "page ";
P_COMMAND : constant STRING := "p "; -- same as page
UNPAGE_COMMAND : constant STRING := "unpage ";
U_COMMAND : constant STRING := "u "; -- same as unpage
--=======================================================================
-- PAGER2, Support Utilities
--=======================================================================
-- Determine if COMMAND contains one of the two target command strings
function IS_COMMAND(TARGET1_COMMAND, TARGET2_COMMAND : in STRING)
return BOOLEAN is
START : NATURAL;
begin
if COMMAND.CONTENT(1) = '-' then
START := 2;
else
START := 1;
end if;
if COMMAND.CONTENT(START .. TARGET1_COMMAND'LENGTH + START - 1)
= TARGET1_COMMAND or
COMMAND.CONTENT(START .. TARGET2_COMMAND'LENGTH + START - 1)
= TARGET2_COMMAND then
return TRUE;
else
return FALSE;
end if;
end IS_COMMAND;
--=======================================================================
-- PAGER2, HELP Command
--=======================================================================
procedure HELP is
procedure SPACER is
begin
TEXT_IO.PUT(" ");
end SPACER;
begin
TEXT_IO.PUT_LINE(" Command Summary");
TEXT_IO.PUT_LINE(" help or h - this summary");
SPACER;
TEXT_IO.PUT_LINE("Syntax: help");
TEXT_IO.PUT_LINE(" exit or x - exit from program");
SPACER;
TEXT_IO.PUT_LINE("Syntax: exit");
TEXT_IO.PUT_LINE
(" include or i- list components into an include file");
SPACER;
TEXT_IO.PUT_LINE
("Syntax: include paged_file_name output_include_file");
TEXT_IO.PUT_LINE(" list or l - list components of paged file");
SPACER;
TEXT_IO.PUT_LINE("Syntax: list paged_file_name");
TEXT_IO.PUT_LINE
(" page or p - create paged file from include file");
SPACER;
TEXT_IO.PUT_LINE
("Syntax: page [@include_file_name|file_name]+ paged_file_name");
TEXT_IO.PUT_LINE
(" unpage or u - extract components from paged file");
SPACER;
TEXT_IO.PUT_LINE("Syntax: unpage paged_file_name");
end HELP;
--=======================================================================
-- PAGER2, Mainline
--=======================================================================
begin
CLI.INITIALIZE ("PAGER2", "Enter verb and arguments: ");
-- Interactive mode if no arguments
if CLI.ARGC = 1 then
TEXT_IO.PUT_LINE(TITLE);
TEXT_IO.PUT_LINE("Type 'h' for Help");
loop
begin
TEXT_IO.PUT("PAGER2> ");
TEXT_IO.GET_LINE(INLINE.CONTENT, INLINE.LAST);
PARSER(INLINE, NARGS, COMMAND, ARGLIST);
if NARGS > 0 then
exit when IS_COMMAND(EXIT_COMMAND, X_COMMAND);
if IS_COMMAND(HELP_COMMAND, H_COMMAND) then
HELP;
elsif IS_COMMAND(CHECK_COMMAND, C_COMMAND) then
PAGED_FILE.COMPUTE_CHECKSUM (NARGS, ARGLIST);
elsif IS_COMMAND(INCLUDE_COMMAND, I_COMMAND) then
PAGED_FILE.MAKE_INCLUDE_FILE (NARGS, ARGLIST);
elsif IS_COMMAND(LIST_COMMAND, L_COMMAND) then
PAGED_FILE.LIST (NARGS, ARGLIST);
elsif IS_COMMAND(PAGE_COMMAND, P_COMMAND) then
PAGED_FILE.CREATE (NARGS, ARGLIST);
elsif IS_COMMAND(UNPAGE_COMMAND, U_COMMAND) then
PAGED_FILE.UNPAGE (NARGS, ARGLIST);
else
TEXT_IO.PUT_LINE(" Invalid Command: " &
LINE_DEFINITION.CONVERT(COMMAND));
end if;
end if;
exception
when others =>
null;
end;
end loop;
-- Non-interactive mode if one or more arguments
else
COMMAND := TOLOWER(LINE_DEFINITION.CONVERT(CLI.ARGV(1) & " "));
NARGS := CLI.ARGC - 1;
ARGLIST := null;
for I in 2 .. CLI.ARGC - 1 loop
if I = 2 then
ARGLIST := new LINE_DEFINITION.LINE_LIST_ELEMENT;
ARG_ROVER := ARGLIST;
else
ARG_ROVER.NEXT := new LINE_DEFINITION.LINE_LIST_ELEMENT;
ARG_ROVER := ARG_ROVER.NEXT;
end if;
ARG_ROVER.NEXT := null;
ARG_ROVER.CONTENT := LINE_DEFINITION.CONVERT(CLI.ARGV(I));
end loop;
if NARGS > 0 then
if IS_COMMAND(HELP_COMMAND, H_COMMAND) then
HELP;
elsif IS_COMMAND(CHECK_COMMAND, C_COMMAND) then
PAGED_FILE.COMPUTE_CHECKSUM (NARGS, ARGLIST);
elsif IS_COMMAND(INCLUDE_COMMAND, I_COMMAND) then
PAGED_FILE.MAKE_INCLUDE_FILE (NARGS, ARGLIST);
elsif IS_COMMAND(LIST_COMMAND, L_COMMAND) then
PAGED_FILE.LIST (NARGS, ARGLIST);
elsif IS_COMMAND(PAGE_COMMAND, P_COMMAND) then
PAGED_FILE.CREATE (NARGS, ARGLIST);
elsif IS_COMMAND(UNPAGE_COMMAND, U_COMMAND) then
PAGED_FILE.UNPAGE (NARGS, ARGLIST);
elsif IS_COMMAND(EXIT_COMMAND, X_COMMAND) then
null;
else
TEXT_IO.PUT_LINE(" Invalid Command: " &
LINE_DEFINITION.CONVERT(COMMAND));
end if;
end if;
end if;
exception
when others =>
null;
end PAGER2;